home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / print / gs261ini.zip / BDFTOPS.PS < prev    next >
Text File  |  1993-05-27  |  24KB  |  749 lines

  1. %    Copyright (C) 1990, 1991, 1993 Aladdin Enterprises.  All rights reserved.
  2. %
  3. % This file is part of Ghostscript.
  4. %
  5. % Ghostscript is distributed in the hope that it will be useful, but
  6. % WITHOUT ANY WARRANTY.  No author or distributor accepts responsibility
  7. % to anyone for the consequences of using it or for whether it serves any
  8. % particular purpose or works at all, unless he says so in writing.  Refer
  9. % to the Ghostscript General Public License for full details.
  10. %
  11. % Everyone is granted permission to copy, modify and redistribute
  12. % Ghostscript, but only under the conditions described in the Ghostscript
  13. % General Public License.  A copy of this license is supposed to have been
  14. % given to you along with Ghostscript so you can know your rights and
  15. % responsibilities.  It should be in a file named COPYING.  Among other
  16. % things, the copyright notice and this notice must be preserved on all
  17. % copies.
  18.  
  19. % bdftops.ps
  20. % Convert a BDF file (possibly with (an) associated AFM file(s))
  21. % to a Ghostscript font.
  22.  
  23. % Ghostscript fonts are in the same format as Adobe Type 1 fonts,
  24. % except that they do not use eexec encryption.
  25. % See gs_fonts.ps for more information.
  26.  
  27. /envBDF 120 dict def
  28. envBDF begin
  29.  
  30. % "Import" the image-to-path package.
  31. % This also brings in the Type 1 opcodes (type1ops.ps).
  32.    (impath.ps) run
  33.  
  34. % "Import" the font-writing package.
  35.    (wrfont.ps) run
  36.    /encrypt_CharStrings true def
  37.  
  38. % Invert the StandardEncoding vector.
  39.    256 dict dup begin
  40.    0 1 255 { dup StandardEncoding exch get exch def } for
  41.    end /decoding exch def
  42.  
  43. % Define the properties copied to FontInfo.
  44.    mark
  45.      (COPYRIGHT) /Notice
  46.      (FAMILY_NAME) /FamilyName
  47.      (FULL_NAME) /FullName
  48.      (WEIGHT_NAME) /Weight
  49.    .dicttomark /properties exch def
  50.  
  51. % Define the character sequences used to fill in some undefined entries
  52. % in the standard encoding.
  53.    mark
  54.      (AE) [/A /E]
  55.      (OE) [/O /E]
  56.      (acute) [/quoteright]
  57.      (ae) [/a /e]
  58.      (bullet) [/asterisk]
  59.      (cedilla) [/comma]
  60.      (circumflex) [/asciicircum]
  61.      (dieresis) [/quotedbl]
  62.      (dotlessi) [/i]
  63.      (ellipsis) [/period /period /period]
  64.      (emdash) [/hyphen /hyphen /hyphen]
  65.      (endash) [/hyphen /hyphen]
  66.      (exclamdown) [/exclam]
  67.      (fi) [/f /i]
  68.      (fl) [/f /l]
  69.      (florin) [/f]
  70.      (fraction) [/slash]
  71.      (germandbls) [/s /s]
  72.      (grave) [/quoteleft]
  73.      (guillemotleft) [/less /less]
  74.      (guillemotright) [/greater /greater]
  75.      (guilsinglleft) [/less]
  76.      (guilsinglright) [/greater]
  77.      (hungarumlaut) [/quotedbl]
  78.      (oe) [/o /e]
  79.      (periodcentered) [/asterisk]
  80.      (questiondown) [/question]
  81.      (quotedblbase) [/comma /comma]
  82.      (quotedblleft) [/quotedbl]
  83.      (quotedblright) [/quotedbl]
  84.      (quotesinglbase) [/comma]
  85.      (quotesingle) [/quoteright]
  86.      (tilde) [/asciitilde]
  87.    .dicttomark /composites exch def
  88.  
  89. % Note the characters that must be defined as subroutines.
  90.    96 dict begin
  91.      0 composites
  92.       { exch pop
  93.          { dup currentdict exch known
  94.         { pop }
  95.         { 1 index def 1 add }
  96.        ifelse
  97.      }
  98.     forall
  99.       }
  100.      forall pop
  101.      currentdict
  102.    end /subrchars exch def
  103.  
  104. % Define the overstruck characters that can be synthesized with seac.
  105.    mark
  106.     [ /Aacute /Acircumflex /Adieresis /Agrave /Aring /Atilde
  107.       /Ccedilla
  108.       /Eacute /Ecircumflex /Edieresis /Egrave
  109.       /Iacute /Icircumflex /Idieresis /Igrave
  110.       /Lslash
  111.       /Ntilde
  112.       /Oacute /Ocircumflex /Odieresis /Ograve /Otilde
  113.       /Scaron
  114.       /Uacute /Ucircumflex /Udieresis /Ugrave
  115.       /Yacute /Ydieresis
  116.       /Zcaron
  117.       /aacute /acircumflex /adieresis /agrave /aring /atilde
  118.       /ccedilla
  119.       /eacute /ecircumflex /edieresis /egrave
  120.       /iacute /icircumflex /idieresis /igrave
  121.       /lslash
  122.       /ntilde
  123.       /oacute /ocircumflex /odieresis /ograve /otilde
  124.       /scaron
  125.       /uacute /ucircumflex /udieresis /ugrave
  126.       /yacute /ydieresis
  127.       /zcaron
  128.     ]
  129.     { dup dup length string cvs
  130.       [ exch dup 0 1 getinterval
  131.         exch dup length 1 sub 1 exch getinterval
  132.       ]
  133.     } forall
  134.      /cent [/c /slash]
  135.      /daggerdbl [/bar /equal]
  136.      /divide [/colon /hyphen]
  137.      /sterling [/L /hyphen]
  138.      /yen [/Y /equal]
  139.    .dicttomark /accentedchars exch def
  140.  
  141. % ------ BDF file parsing utilities ------ %
  142.  
  143. % Define a buffer for reading the BDF file.
  144.    /buffer 400 string def
  145.  
  146. % Read a line from the BDF file into the buffer.
  147. % Define /keyword as the first word on the line.
  148. % Define /args as the remainder of the line.
  149. % If the keyword is equal to commentword, skip the line.
  150. % (If commentword is equal to a space, never skip.)
  151.    /nextline
  152.     { bdfile buffer readline not
  153.        { (Premature EOF\n) print stop } if
  154.       ( ) search
  155.        { /keyword exch def pop }
  156.        { /keyword exch def () }
  157.       ifelse
  158.       /args exch def
  159.       keyword commentword eq { nextline } if
  160.     } bind def
  161.  
  162. % Get a word argument from args.  We do *not* copy the string.
  163.    /warg        % warg -> string
  164.     { args ( ) search
  165.        { exch pop exch }
  166.        { () }
  167.       ifelse  /args exch def
  168.     } bind def
  169.  
  170. % Get an integer argument from args.
  171.    /iarg        % iarg -> int
  172.     { warg cvi
  173.     } bind def
  174.  
  175. % Get a numeric argument from args.
  176.    /narg        % narg -> int|real
  177.     { warg cvr
  178.       dup dup cvi eq { cvi } if
  179.     } bind def
  180.  
  181. % Convert the remainder of args into a string.
  182.    /remarg        % remarg -> string
  183.     { args copystring
  184.     } bind def
  185.  
  186. % Get a string argument that occupies the remainder of args.
  187.    /sarg        % sarg -> string
  188.     { args (") anchorsearch
  189.        { pop /args exch def } { pop } ifelse
  190.       args args length 1 sub get (") 0 get eq
  191.        { args 0 args length 1 sub getinterval /args exch def } if
  192.       args copystring
  193.     } bind def
  194.  
  195. % Check that the keyword is the expected one.
  196.    /checkline        % (EXPECTED-KEYWORD) checkline ->
  197.     { dup keyword ne
  198.        { (Expected ) print =
  199.          (Line=) print keyword print ( ) print args print (\n) print stop
  200.        } if
  201.       pop
  202.     } bind def
  203.  
  204. % Read a line and check its keyword.
  205.    /getline        % (EXPECTED-KEYWORD) getline ->
  206.     { nextline checkline
  207.     } bind def
  208.  
  209. % Find the first/last non-zero bit of a non-zero byte.
  210.    /fnzb
  211.     { 0 { exch dup 128 ge { pop exit } { dup add exch 1 add } ifelse }
  212.       loop
  213.     } bind def
  214.    /lnzb
  215.     { 7 { exch dup 1 and 0 ne { pop exit } { -1 bitshift exch 1 sub } ifelse }
  216.       loop
  217.     } bind def
  218.  
  219. % ------ Type 1 encoding utilities ------ %
  220.  
  221. % Parse the side bearing and width information that begins a CharString.
  222. % Arguments: charstring.  Result: mark sbx wx substring *or*
  223. % mark sbx sby wx wy substring.
  224.    /parsesbw
  225.     { mark exch lenIV
  226.        {        % stack: mark ... string dropcount
  227.          dup 2 index length exch sub getinterval
  228.      dup 0 get dup 32 lt { pop exit } if
  229.      dup 246 le
  230.       { 139 sub exch 1 }
  231.       { dup 250 le
  232.          { 247 sub 8 bitshift 108 add 1 index 1 get add exch 2 }
  233.          { dup 254 le
  234.             { 251 sub 8 bitshift 108 add 1 index 1 get add neg exch 2 }
  235.         { pop dup 1 get 128 xor 128 sub
  236.           8 bitshift 1 index 2 get add
  237.           8 bitshift 1 index 3 get add
  238.           8 bitshift 1 index 4 get add exch 5
  239.         } ifelse
  240.          } ifelse
  241.       } ifelse
  242.        } loop
  243.     } bind def 
  244.  
  245. % Find the side bearing and width information that begins a CharString.
  246. % Arguments: charstring.  Result: charstring sizethroughsbw.
  247.    /findsbw
  248.     { dup parsesbw counttomark 1 add 1 roll cleartomark skipsbw
  249.     } bind def
  250.    /skipsbw        % charstring sbwprefix -> sizethroughsbw
  251.     { length 1 index length exch sub
  252.       2 copy get 12 eq { 2 } { 1 } ifelse add
  253.     } bind def
  254.  
  255. % Encode a number, and append it to a string.
  256. % Arguments: str num.  Result: newstr.
  257.    /concatnum
  258.     { dup dup -107 ge exch 107 le and
  259.        { 139 add 1 string dup 0 3 index put }
  260.        { dup dup -1131 ge exch 1131 le and
  261.           { dup 0 ge { 16#f694 } { neg 16#fa94 } ifelse add
  262.         2 string dup 0 3 index -8 bitshift put
  263.         dup 1 3 index 255 and put
  264.       }
  265.       { 5 string dup 0 255 put exch
  266.         2 copy 1 exch -2